我覺得模組的概念其實很像繼承,但在意義上有所不同。
想想看,如果有種行為是特定幾個類別所需要的,那該怎麼解決?
若是用繼承的方法,可能造成不需要的類別,擁有這樣的行為
或許會說,不如就在子類別覆寫父類別行為,就可以避免了
這樣的做法在技術上是可行的,但會造成繼承失去意義
因為子類別本來就應該擁有父類別所提供的行為,當行為被子類別覆蓋後,子類別就不再屬於父類別了
最好的方法是使用模組(Module)
如同裝備一樣,掛在身上去執行動作就好!
而模組與繼承相同的概念就是分離抽象
既然是繼承與模組都是提供介面使用,那方法是從何而來的呢?
這張圖可以簡單解釋部分流程!
首先天藍色部分都是類別,而循著線往上,天藍色彼此間都是繼承的關係
而黃色部份則是模組,而會因為方法使用不同,而擺在不同位置
像是圖中的C1類別使用include引進M1模組,所以他會存在C1之上,若是C1內找不到方法,就會向上跑到M1找尋,再找不到就在循線向上
而perpend方法,則會放在引進類別的下方,所以會先到M2找尋,再依序向上
為了不讓這整篇太複雜,簡單介紹一下extend方法。
其作用是將模組(Module)的行為直接加入到某個物件之中
換句話說
還有一個叫做 單例類別(Singleton class) 這方法會專屬於特定物件
但不建議使用,因為可能會導致程式碼架構混亂
最後!其實書中還有解釋到 里氏替換原則 (Liskov substitution principle)
但這部分會在SOLID原則中一同解釋,所以這邊就不多說啦~
快樂星期五,就該好好休息囉! 假日快樂 :)
感謝大家 如有問題,再煩請大家指教!